#ifndef GRAPHICS_VIEW_H
#define GRAPHICS_VIEW_H

#define ECS_SPECIFIC

#include <exec/types.h>
#include <exec/semaphores.h>
//#include <graphics/gfx.h>
//#include <graphics/copper.h>
//#include <graphics/gfxnodes.h>
//#include <graphics/monitor.h>
//#include <graphics/displayinfo.h>
//#include <hardware/custom.h>

struct ViewPort
{
	//ViewPort *		Next;
	//ColorMap *		ColorMap;			// table of colors for this viewport 
											// if this is nil, MakeVPort assumes default values 
	//CopList  *		DspIns;				// used by MakeVPort() 
	//CopList  *		SprIns;				// used by sprite stuff 
	//CopList  *		ClrIns;				// used by sprite stuff 
	//UCopList *		UCopIns;			// User copper list 
	APTR			Data;					// Screen data
	UWORD			Width, Height, Depth;
	//RasInfo *		RasInfo;
};

/*
struct View
{
	ViewPort *	ViewPort;
	//cprlist *	LOFCprList;				// used for interlaced and noninterlaced 
	//cprlist *	SHFCprList;				// only used during interlace 
	WORD		DyOffset, DxOffset;		// for complete View positioning 
										// offsets are +- adjustments to standard #s 
	UWORD	Modes;						// such as INTERLACE, GENLOC 
};

*/



/*
// these structures are obtained via GfxNew 
// and disposed by GfxFree 
struct ViewExtra
{
	ExtendedNode	n;
	View *			View;		// backwards link 
	MonitorSpec *	Monitor;	// monitors for this view 
	UWORD			TopLine;
};

//
// this structure is obtained via GfxNew 
// and disposed by GfxFree 
struct ViewPortExtra
{
	ExtendedNode	n;
	ViewPort *		ViewPort;			// backwards link 
	Rectangle		DisplayClip;		// MakeVPort display clipping information 
	APTR			VecTable;			// Private 
	APTR			DriverData[2];
	UWORD			Flags;
	Point			Origin[2];			// First visible point relative to the DClip.
										// One for each possible playfield.
	ULONG			cop1ptr;			// private 
	ULONG			cop2ptr;			// private 
};
*/
// All these VPXF_ flags are private 
#define VPXB_FREE_ME		0
#define VPXF_FREE_ME		(1 << VPXB_FREE_ME)
#define VPXB_LAST		1
#define VPXF_LAST		(1 << VPXB_LAST)
#define VPXB_STRADDLES_256	4
#define VPXF_STRADDLES_256	(1 << VPXB_STRADDLES_256)
#define VPXB_STRADDLES_512	5
#define VPXF_STRADDLES_512	(1 << VPXB_STRADDLES_512)


#define EXTEND_VSTRUCT	0x1000	// unused bit in Modes field of View 

#define VPF_A2024	      0x40	// VP?_ fields internal only 
#define VPF_TENHZ	      0x20
#define VPB_A2024	      6
#define VPB_TENHZ	      4

// defines used for Modes in IVPargs 

#define GENLOCK_VIDEO			0x0002
#define LACE					0x0004
#define DOUBLESCAN				0x0008
#define SUPERHIRES				0x0020
#define PFBA					0x0040
#define EXTRA_HALFBRITE			0x0080
#define GENLOCK_AUDIO			0x0100
#define DUALPF					0x0400
#define HAM						0x0800
#define EXTENDED_MODE			0x1000
#define VP_HIDE					0x2000
#define SPRITES					0x4000
#define HIRES					0x8000

/*
// used by callers to and InitDspC() 
struct RasInfo	
{
	RasInfo *		Next;				// used for dualpf 
	//BitMap *		BitMap;
	WORD			RxOffset, RyOffset;	   // scroll offsets in this BitMap
};

struct ColorMap
{
	UBYTE			Flags;
	UBYTE			Type;
	UWORD			Count;
	APTR			ColorTable;
	iewPortExtra *	cm_vpe;
	APTR			LowColorBits;
	UBYTE			TransparencyPlane;
	UBYTE			SpriteResolution;
	UBYTE			SpriteResDefault;	// what resolution you get when you have set SPRITERESN_DEFAULT
	UBYTE			AuxFlags;
	ViewPort *		cm_vp;
	APTR			NormalDisplayInfo;
	APTR			CoerceDisplayInfo;
	TagItem *		cm_batch_items;
	ULONG			VPModeID;
	PaletteExtra *	PalExtra;
	UWORD			SpriteBase_Even;
	UWORD			SpriteBase_Odd;
	UWORD			Bp_0_base;
	UWORD			Bp_1_base;

};
*/
// if Type == 0 then ColorMap is V1.2/V1.3 compatible 
// if Type != 0 then ColorMap is V38	   compatible 
// the system will never create other than V39 type colormaps when running V39 

#define COLORMAP_TYPE_V1_2	0x00
#define COLORMAP_TYPE_V1_4	0x01
#define COLORMAP_TYPE_V36 COLORMAP_TYPE_V1_4	// use this definition 
#define COLORMAP_TYPE_V39	0x02

// Flags variable 
#define COLORMAP_TRANSPARENCY	0x01
#define COLORPLANE_TRANSPARENCY	0x02
#define BORDER_BLANKING		0x04
#define BORDER_NOTRANSPARENCY	0x08
#define VIDEOCONTROL_BATCH	0x10
#define USER_COPPER_CLIP	0x20
#define BORDERSPRITES	0x40

#define CMF_CMTRANS	0
#define CMF_CPTRANS	1
#define CMF_BRDRBLNK	2
#define CMF_BRDNTRAN	3
#define CMF_BRDRSPRT	6

#define SPRITERESN_ECS		0
// ^140ns, except in 35ns viewport, where it is 70ns. 
#define SPRITERESN_140NS	1
#define SPRITERESN_70NS		2
#define SPRITERESN_35NS		3
#define SPRITERESN_DEFAULT	-1

// AuxFlags : 
#define CMAB_FULLPALETTE 0
#define CMAF_FULLPALETTE (1<<CMAB_FULLPALETTE)
#define CMAB_NO_INTERMED_UPDATE 1
#define CMAF_NO_INTERMED_UPDATE (1<<CMAB_NO_INTERMED_UPDATE)
#define CMAB_NO_COLOR_LOAD 2
#define CMAF_NO_COLOR_LOAD (1 << CMAB_NO_COLOR_LOAD)
#define CMAB_DUALPF_DISABLE 3
#define CMAF_DUALPF_DISABLE (1 << CMAB_DUALPF_DISABLE)

/*
struct PaletteExtra				// structure may be extended so watch out!
{
	SignalSemaphore		pe_Semaphore;				// shared semaphore for arbitration	
	UWORD				pe_FirstFree;				// *private*				
	UWORD				pe_NFree;					// number of free colors		
	UWORD				pe_FirstShared;				// *private*				
	UWORD				pe_NShared;					// *private*				
	UBYTE *				pe_RefCnt;					// *private*				
	UBYTE *				pe_AllocList;				// *private*				
	ViewPort *			pe_ViewPort;				// back pointer to viewport		
	UWORD				pe_SharableColors;			// the number of sharable colors.	
};
*/

// flags values for ObtainPen 

#define PENB_EXCLUSIVE 0
#define PENB_NO_SETCOLOR 1

#define PENF_EXCLUSIVE (1l<<PENB_EXCLUSIVE)
#define PENF_NO_SETCOLOR (1l<<PENB_NO_SETCOLOR)

// obsolete names for PENF_xxx flags: 

#define PEN_EXCLUSIVE PENF_EXCLUSIVE
#define PEN_NO_SETCOLOR PENF_NO_SETCOLOR

// precision values for ObtainBestPen : 

#define PRECISION_EXACT	-1
#define PRECISION_IMAGE	0
#define PRECISION_ICON	16
#define PRECISION_GUI	32


// tags for ObtainBestPen: 
#define OBP_Precision 0x84000000
#define OBP_FailIfBad 0x84000001



// From V39, MakeVPort() will return an error if there is not enough memory,
// or the requested mode cannot be opened with the requested depth with the
// given bitmap (for higher bandwidth alignments).
 

#define MVP_OK		0	// you want to see this one 
#define MVP_NO_MEM	1	// insufficient memory for intermediate workspace 
#define MVP_NO_VPE	2	// ViewPort does not have a ViewPortExtra, and insufficient memory to allocate a temporary one.
 
#define MVP_NO_DSPINS	3	// insufficient memory for intermidiate copper instructions.
 
#define MVP_NO_DISPLAY	4	// BitMap data is misaligned for this viewport's mode and depth - see AllocBitMap().
 
#define MVP_OFF_BOTTOM	5	// PRIVATE - you will never see this. 

#define MCOP_OK		0	// you want to see this one 
#define MCOP_NO_MEM	1	// insufficient memory to allocate the system copper lists.
 
#define MCOP_NOP	2	// MrgCop() did not merge any copper lists (eg, no ViewPorts in the list, or all marked as hidden).
 
/*
struct DBufInfo
{
	APTR	dbi_Link1;
	ULONG	dbi_Count1;
	Message dbi_SafeMessage;		// replied to when safe to write to old bitmap 
	APTR	dbi_UserData1;			// first user data 

	APTR	dbi_Link2;
	ULONG	dbi_Count2;
	Message dbi_DispMessage;		/// replied to when new bitmap has been displayed at least once 
	APTR	dbi_UserData2;			/// second user data 
	ULONG	dbi_MatchLong;
	APTR	dbi_CopPtr1;
	APTR	dbi_CopPtr2;
	APTR	dbi_CopPtr3;
	UWORD	dbi_BeamPos1;
	UWORD	dbi_BeamPos2;
};
*/
#endif	

